import ZodTypes from './ZodTypes.js'
import Zodiac from './Zodiac.js'

// 十二宫(12个星座的享元)
// 双向的迭代模式
// 单例模式
class TheZodiac {
    /**
     * Constructor
     * 构造函数
     *
     * @return void
     */
    constructor(index) {
        if (typeof TheZodiac.instance === 'object') {
            return TheZodiac.instance
        }
        this.init(index)
        TheZodiac.instance = this
        return this
    }

    /**
     * Init
     * 初始化
     *
     * @param Number index 初始索引
     *
     * @return <+Return+>
     */
    init(index) {
        this.zodiacs = []
        this.buildTheZodiac()
        // 1至12循环12的下一个是1
        this.index = typeof index === 'undefined' ? 1 : index
    }

    /**
     * BuildTheZodiac
     * 构建12宫
     *
     * @return void
     */
    buildTheZodiac() {
        // 循环构建12星座
        for (var type in ZodTypes) {
            this.buildZodiac(type)
        }
    }

    /**
     * BuildZodiac
     * 构建星座的单个享元
     * 若已构建过则从享元池里取
     *
     * @param name 星座名
     *
     * @return zodiac
     */
    buildZodiac(name) {
        let index = ZodTypes[name].index
        let zodiac = this.zodiacs[index]
        if (zodiac) return zodiac
        this.zodiacs[index] = new Zodiac(name)
        return this.zodiacs[index]
    }

    /**
     * Next
     * 下一个星座
     *
     * @return zodiac
     */
    next() {
        if (this.hasNext()) {
            // 下标没越界的情况
            return this.zodiacs[++this.index]
        } else {
            // 下标越界的情况
            this.index = 1
            return this.zodiacs[this.index]
        }
    }

    /**
     * HasNext
     * (数组)存在下一个元素
     *
     * @return boolean
     */
    hasNext() {
        return this.index < 12
    }

    /**
     * Previous
     * 上一个星座
     *
     * @param  <+Comment+>
     *
     * @return zodiac
     */
    previous() {
        if (this.hasPrevious()) {
            // 下标没越界的情况
            return this.zodiacs[--this.index]
        } else {
            // 下标越界的情况
            this.index = 12
            return this.zodiacs[this.index]
        }
    }

    /**
     * HasPrevious
     * (数组)存在上一个元素
     *
     * @return boolean
     */
    hasPrevious() {
        return this.index > 1
    }

    /**
     * Current
     * 当前星座
     *
     * @return zodiac
     */
    current() {
        return this.zodiacs[this.index]
    }
}

export default TheZodiac
